package datatypes.list;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import junit.framework.JUnit4TestAdapter;

import org.junit.Before;
import org.junit.Test;

public class DoublyLinkedList_test {
	
	class TestPayload implements NodeStakeholder<TestPayload> {
		
		public int number;
		private Node<TestPayload> ref;
		
		public TestPayload (int number) {
			this.number = number;
		}

		@Override
		public void updateNode(Node<TestPayload> node) {
			setReference(node);
		}

		public void setReference(Node<TestPayload> reference) {
			if (ref != null) {
				this.ref.cancelStakeholderRegistration(this);
			}
			if (reference != null) {
				reference.registerAsStakeholder(this);
			}
			this.ref = reference;
		}

		public Node<TestPayload> getReference() {
			return ref;
		}
		
		@Override
		public String toString() {
			return "Element " + number;
		}
		
	}
	
	public static junit.framework.Test suite() {
		return new JUnit4TestAdapter(DoublyLinkedList_test.class);
	}
	
	DoublyLinkedList<TestPayload> list;
	TestPayload stakeholder;

	@Before
	public void setUp() throws Exception {
		list = new DoublyLinkedList<TestPayload>();
		for (int i = 0; i < 10; i++) {
			list.add(new TestPayload(i));
		}
		stakeholder = new TestPayload(-1);
		Node<TestPayload> second = list.headNode().next;
		stakeholder.setReference(second);
	}

//	@Test
//	public void testAddE() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testMoveToHead() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testHeadNode() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testPeek() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testHasNext() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testNext() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testNextNode() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testHasPrevious() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testPrevious() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testAddIntE() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testAddAllCollectionOfQextendsE() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testAddAllIntCollectionOfQextendsE() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testClear() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testContains() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testContainsAll() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testGet() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testIndexOf() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testIsEmpty() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testIterator() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testLastIndexOf() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testListIterator() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testListIteratorInt() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testCount() {
//		fail("Not yet implemented");
//	}
//
	
	@Test
	public void testRemoveObject() {
		Node<TestPayload> second = list.headNode().next;
		Node<TestPayload> third = second.next;
		Node<TestPayload> fourth = third.next;
		
		assertEquals("", second, stakeholder.getReference());
		
		list.remove(second.element);
		for (TestPayload element : list) {
			if (element == second.element) {
				fail(second + "should have been removed!");
			}
		}
		assertEquals("", third, stakeholder.getReference());
		list.remove(third.element);
		assertEquals("", fourth, stakeholder.getReference());
		assertFalse(fourth.isRemoved());
		assertTrue(third.isRemoved());
		
	}
	
//
//	@Test
//	public void testRemoveInt() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testRemoveAll() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testRetainAll() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testSet() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testSize() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testSubList() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testToArray() {
//		fail("Not yet implemented");
//	}
//
//	@Test
//	public void testToArrayTArray() {
//		fail("Not yet implemented");
//	}

}
